Written by: baeldung

1. Khái quát chung

Trong hướng dẫn này, chúng ta sẽ xem cách chuyển đổi một mảng byte thành
MultipartFile .

MutlipartFile là một giao diện do Spring cung cấp để nhận các tệp trong nhiều khối yêu cầu, vì vậy chúng tôi cần một số triển khai để khởi tạo một đối tượng MultipartFile . Spring không cung cấp bất kỳ triển khai mặc định nào cho mã, nhưng nó cung cấp một triển khai cho mục đích thử nghiệm.

2. Triển khai Giao diện MultipartFile

Hãy tạo triển khai của riêng chúng ta cho giao diện MultipartFile và bọc mảng byte đầu vào :

public class CustomMultipartFile implements MultipartFile {

    private byte[] input;

    @Override
    public String getName() {
        return null;
    }

    @Override
    public String getOriginalFilename() {
        return null;
    }

    @Override
    public String getContentType() {
        return null;
    }
    //We've defined the rest of the interface methods in the next snippet
}

Chúng tôi đã định nghĩa một thuộc tính mảng byte trong lớp của mình để chúng tôi có thể nắm bắt giá trị cho đầu vào . Ngoài ra, chúng tôi đã ghi đè các phương thức từ giao diện ở trên, tùy thuộc vào chi tiết triển khai. Do đó, chi tiết về tên tệp hoặc loại nội dung có thể được cung cấp dưới dạng logic tùy chỉnh. Kết quả là, chúng tôi đã trả về null ở đây.

Chúng tôi cũng đã cung cấp triển khai của riêng mình cho các phương thức cần thiết khác từ giao diện:

public class CustomMultipartFile implements MultipartFile {

    //previous methods
    @Override
    public boolean isEmpty() {
        return input == null || input.length == 0;
    }

    @Override
    public long getSize() {
        return input.length;
    }

    @Override
    public byte[] getBytes() throws IOException {
        return input;
    }

    @Override
    public InputStream getInputStream() throws IOException {
        return new ByteArrayInputStream(input);
    }

    @Override
    public void transferTo(File destination) throws IOException, IllegalStateException {
        try(FileOutputStream fos = new FileOutputStream(destination)) {
            fos.write(input);
        }
    }
}

Các phương thức này có thể không yêu cầu bất kỳ logic tùy chỉnh nào, vì vậy chúng tôi đã định nghĩa chúng trong lớp của mình. Có một số cách khác nhau để triển khai phương thức transferTo(Filedestination) . Chúng ta hãy xem một vài trong số họ dưới đây:

Chúng ta có thể sử dụng Java NIO:

@Override
public void transferTo(File destination) throws IOException, IllegalStateException {
    Path path = Paths.get(destination.getPath());
    Files.write(path, input);
}

Một tùy chọn khác là thêm phần phụ thuộc IO chung của Apache vào POM của chúng tôi và sử dụng lớp FileUtils :

@Override
public void transferTo(File destination) throws IOException, IllegalStateException {
    FileUtils.writeByteArrayToFile(destination, input);
}

Phương thức transferTo(Filedestination) rất hữu ích khi MultipartFile chỉ cần được ghi vào một File và có một số cách để ghi MultipartFile vào File .

Bây giờ chúng ta đã định nghĩa lớp của mình, hãy kiểm tra triển khai này bằng một trường hợp thử nghiệm nhỏ:

@Test
void whenProvidingByteArray_thenMultipartFileCreated() throws IOException {
    byte[] inputArray = "Test String".getBytes();
    CustomMultipartFile customMultipartFile = new CustomMultipartFile(inputArray);
    Assertions.assertFalse(customMultipartFile.isEmpty());
    Assertions.assertArrayEquals(inputArray, customMultipartFile.getBytes());
    Assertions.assertEquals(inputArray.length,customMultipartFile.getSize());
}

Chúng tôi đã chuyển đổi thành công mảng byte của mình thành phiên bản MultipartFile trong trường hợp thử nghiệm ở trên.

3. MockMultipartFile

Spring cung cấp MockMultipartFile ngay lập tức cho mục đích thử nghiệm để truy cập các yêu cầu Multipart.

Hãy tạo một thử nghiệm để xem nó hoạt động như thế nào:

@Test
void whenProvidingByteArray_thenMockMultipartFileCreated() throws IOException {
    byte[] inputArray = "Test String".getBytes();
    MockMultipartFile mockMultipartFile = new MockMultipartFile("tempFileName",inputArray);
    Assertions.assertFalse(mockMultipartFile.isEmpty());
    Assertions.assertArrayEquals(inputArray, mockMultipartFile.getBytes());
    Assertions.assertEquals(inputArray.length,mockMultipartFile.getSize());
}

Chúng ta đã sử dụng thành công đối tượng MockMultipartFile do Spring cung cấp để chuyển đổi mảng byte thành Đối tượng MultipartFile .

4. Kết luận

Trong hướng dẫn này, chúng tôi đã giới thiệu cách chuyển đổi một mảng byte thành một đối tượng MultipartFile .

Như thường lệ, tất cả các ví dụ mã có thể được tìm thấy trên GitHub .

Cám ơn bạn đã theo dõi!!!